#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
联系人管理控制器（合并版本）
将路由和控制器合并到一个类中
"""

from flask import Blueprint, jsonify, request, current_app
from services.app_service import AppService
from services.wechat_sync_service import WechatSyncService
from services.contact_service import ContactService
from dao.contact_dao import ContactDAO
from utils.R import R
from settings import get_logger

# API版本
API_VERSION = 'v1'

# 创建蓝图
contact_bp = Blueprint('contact', __name__, url_prefix=f'/api/{API_VERSION}/contact')

class ContactController:
    """
    联系人管理控制器
    负责联系人相关的路由处理
    """
    
    def __init__(self):
        """
        初始化控制器并注册路由
        """
        self.app_service = AppService()
        self.sync_service = WechatSyncService()
        self.contact_dao = ContactDAO()
        self.contact_service = ContactService()
        self.logger = get_logger(__name__)
        self._register_routes()
    
    def _register_routes(self):
        """
        注册路由
        """
        contact_bp.route('/friends', methods=['GET'])(self.get_friends)
        contact_bp.route('/contacts/<account_id>', methods=['GET'])(self.get_contacts_by_account)
        contact_bp.route('/friends/get/wechat_name', methods=['POST'])(self.get_contact_by_wechat_name)
        contact_bp.route('/groups', methods=['GET'])(self.get_groups)
        contact_bp.route('/sync', methods=['POST'])(self.sync_contacts)
        contact_bp.route('/sync/status/<task_id>', methods=['GET'])(self.get_sync_status)
    
    def get_friends(self):
        """
        获取好友列表，支持分页
        
        查询参数:
            account: 账号，如果不提供则使用当前账号
            page: 页码，从1开始，默认为1
            per_page: 每页记录数，默认为20
            
        Returns:
            ApiResponse: 包含分页信息和好友列表的响应
        """
        try:
            # 从请求中提取参数
            account = request.args.get('account')
            page = request.args.get('page', 1, type=int)
            per_page = request.args.get('per_page', 20, type=int)
            
            # 参数校验
            if page < 1:
                page = 1
            if per_page < 1 or per_page > 100:
                per_page = 20
                
            self.logger.debug(f"获取好友列表参数: account={account}, page={page}, per_page={per_page}")
            
            app_instance = self.app_service.get_app_instance()
            
            if not app_instance:
                return R.fail(message="微信后端应用未初始化")
            
            # 调用服务层获取好友列表
            result = self.contact_service.get_friends(account, page, per_page)
            
            return result
            
        except Exception as e:
            self.logger.error(f"获取好友列表失败: {e}")
            return R.fail(message="获取好友列表失败")
    
    def get_contacts_by_account(self, account_id):
        """
        根据账号获取联系人列表
        
        Args:
            account_id: 账号ID
            
        Returns:
            ApiResponse: 包含联系人列表的响应
        """
        try:
            self.logger.debug(f"获取账号 {account_id} 的联系人列表")
            
            # 调用服务层获取联系人列表
            result = self.contact_service.get_contacts_by_account(account_id)
            
            return result
            
        except Exception as e:
            self.logger.error(f"获取联系人列表失败: {e}")
            return R.fail(message="获取联系人列表失败")
    
    def get_contact_by_wechat_name(self):
        """
        根据微信名称获取联系人
        
        Returns:
            ApiResponse: 包含联系人信息的响应
        """
        try:
            data = request.get_json()
            if not data:
                return R.fail(message="请求数据为空")
            
            wechat_name = data.get('wechat_name')
            if not wechat_name:
                return R.fail(message="缺少微信名称参数")
            
            self.logger.debug(f"根据微信名称 {wechat_name} 获取联系人")
            
            # 调用服务层获取联系人
            result = self.contact_service.get_contact_by_wechat_name(wechat_name)
            
            return result
            
        except Exception as e:
            self.logger.error(f"根据微信名称获取联系人失败: {e}")
            return R.fail(message="获取联系人失败")
    
    def get_groups(self):
        """
        获取群聊列表
        
        Returns:
            ApiResponse: 包含群聊列表的响应
        """
        try:
            # 从请求中提取参数
            account = request.args.get('account')
            page = request.args.get('page', 1, type=int)
            per_page = request.args.get('per_page', 20, type=int)
            
            # 参数校验
            if page < 1:
                page = 1
            if per_page < 1 or per_page > 100:
                per_page = 20
                
            self.logger.debug(f"获取群聊列表参数: account={account}, page={page}, per_page={per_page}")
            
            app_instance = self.app_service.get_app_instance()
            
            if not app_instance:
                return R.fail(message="微信后端应用未初始化")
            
            # 调用服务层获取群聊列表
            result = self.contact_service.get_groups(account, page, per_page)
            
            return result
            
        except Exception as e:
            self.logger.error(f"获取群聊列表失败: {e}")
            return R.fail(message="获取群聊列表失败")
    
    def sync_contacts(self):
        """
        同步联系人
        
        Returns:
            ApiResponse: 包含同步任务ID的响应
        """
        try:
            data = request.get_json() or {}
            account_id = data.get('account_id')
            
            self.logger.info(f"开始同步联系人，账号ID: {account_id}")
            
            app_instance = self.app_service.get_app_instance()
            
            if not app_instance:
                return R.fail(message="微信后端应用未初始化")
            
            # 调用同步服务开始同步
            task_id = self.sync_service.start_sync(account_id)
            
            if task_id:
                return R.ok(data={"task_id": task_id}, message="同步任务已启动")
            else:
                return R.fail(message="启动同步任务失败")
            
        except Exception as e:
            self.logger.error(f"同步联系人失败: {e}")
            return R.fail(message="同步联系人失败")
    
    def get_sync_status(self, task_id):
        """
        获取同步状态
        
        Args:
            task_id: 任务ID
            
        Returns:
            ApiResponse: 包含同步状态的响应
        """
        try:
            self.logger.debug(f"获取同步状态，任务ID: {task_id}")
            
            # 调用同步服务获取状态
            status = self.sync_service.get_sync_status(task_id)
            
            if status:
                return R.ok(data=status)
            else:
                return R.fail(message="获取同步状态失败")
            
        except Exception as e:
            self.logger.error(f"获取同步状态失败: {e}")
            return R.fail(message="获取同步状态失败")

# 实例化控制器，确保路由被注册
contact_controller = ContactController()